// 调用Adafruit_NeoPixel模块
#include <Adafruit_NeoPixel.h>

// 设置灯珠数量：24灯珠灯环
#define NUMPIXELS        24

// 设置SPI输出数据引脚：SPI2_MOSI
#define PIN_NEOPIXEL    PB15

// LED引脚设置：板载User LED
#define PIN_LED         PB13

// 初始化灯珠控制实例
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

// 当前灯珠指向
int16_t idx = 0;

// 上一课灯珠指向
int16_t idx_prev = 0;

// 方向
int16_t direction = 0;

// 转换方向
int16_t type = 1;

// 启动设置
void setup() {
  // 调试串口速率设置
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);

  // 灯珠控制开始
  pixels.begin();

  // 设置亮度为20
  pixels.setBrightness(20);

  // 设置灯珠颜色，全部关闭
  pixels.fill(0x000000);

  delay(100);

  // 设置灯珠颜色
  pixels.fill(0xFF0000);

  delay(100);

  pixels.clear();

  if(direction==0) {
    // 当前灯珠指向
    idx = 0;
    
    // 上一课灯珠指向
    idx_prev = NUMPIXELS - 1;    
  } else {
    // 当前灯珠指向
    idx = 0;
    
    // 上一课灯珠指向
    idx_prev = 1;
  }
}


// 循环主体程序
void loop() {
  if (idx % 2 == 0) {
    // 点亮LED
    digitalWrite(PIN_LED, HIGH);
  } else {
    digitalWrite(PIN_LED, LOW);
  }

  // 设置灯珠颜色
  if(direction==0) {
    if (idx == 0) {
      idx_prev = NUMPIXELS - 1;
    } else {
      idx_prev = idx - 1;
    }
  } else {
    if (idx == NUMPIXELS - 1) {
        idx_prev = 0;
    } else {
      idx_prev = idx + 1;
    }    
  }

  // 串口输出
  Serial.print("type=");
  Serial.print(type);
  Serial.print(" direction=");
  Serial.print(direction);
  Serial.print(" index=");
  Serial.print(idx);
  Serial.print(" prev=");
  Serial.print(idx_prev);

  // 熄灭上一课灯珠
  pixels.setPixelColor(idx_prev, pixels.Color(0, 0, 0));

  // 点亮当前灯珠
  uint16_t c1 = idx % 3 == 0 ? (100 + random(100)) : (0 + random(50));
  uint16_t c2 = idx % 3 == 1 ? (100 + random(100)) : (0 + random(50));
  uint16_t c3 = idx % 3 == 2 ? (100 + random(100)) : (0 + random(50));
  Serial.print(" c1=");
  Serial.print(c1);
  Serial.print(" c2=");
  Serial.print(c2);
  Serial.print(" c3=");
  Serial.print(c3);
  Serial.println("");
  pixels.setPixelColor(idx, pixels.Color(c1, c2, c3));

  // 显示
  pixels.show();

  // 延时
  delay(50);

  if(direction==0) {
    idx++;
  
    if (idx >= NUMPIXELS) {
      if(type==0) {
        idx = 0;
      } else {
        idx = NUMPIXELS - 1;
        direction = 1;
      }
    }
  } else {
    idx--;
    if (idx<0) {
      if(type==0) {
        idx = NUMPIXELS - 1;
      } else {
        idx = 0;
        direction = 0;
      }
    }    
  }
}
